//+------------------------------------------------------------------+
//|                                                 DateDropList.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "WndContainer.h"
#include "BmpButton.h"
#include "Picture.h"
#include <Canvas/Canvas.h>
#include <Tools/DateTime.h>
//+------------------------------------------------------------------+
//| 日期模式枚举                                                       |
//+------------------------------------------------------------------+
enum ENUM_DATE_MODES
  {
   DATE_MODE_MON,                           // 月份模式（显示当月日期）
   DATE_MODE_YEAR                           // 年份模式（显示当年月份）
  };
//+-----------------------------------------------------------------
//| 资源声明：日期控件按钮位图                                         |
//+------------------------------------------------------------------+
#resource "res\\LeftTransp.bmp"            // 左移按钮位图
#resource "res\\RightTransp.bmp"           // 右移按钮位图
//+------------------------------------------------------------------+
//| CDateDropList 类                                                   |
//| 功能：实现日期选择下拉列表控件，支持月份/年份模式切换                |
//+------------------------------------------------------------------+
class CDateDropList : public CWndContainer
  {
private:
   // 子控件：组成日期选择器的核心元素
   CBmpButton        m_dec;                 // 减少按钮（左移/上一个）
   CBmpButton        m_inc;                 // 增加按钮（右移/下一个）
   CPicture          m_list;                // 下拉列表图片控件
   CCanvas           m_canvas;              // 画布（用于绘制日期界面）
   
   // 数据存储与配置
   CDateTime         m_value;               // 当前选中的日期值
   ENUM_DATE_MODES   m_mode;                // 操作模式（月份/年份）
   CRect             m_click_rect[32];      // 画布上的点击感应区域数组

public:
   /** 构造函数：初始化日期选择器状态 */
                     CDateDropList(void);
   /** 析构函数：清理资源 */
                    ~CDateDropList(void);

   //--- 创建控件
   /**
    * @brief 在图表上创建日期下拉列表控件
    * @param chart 目标图表ID
    * @param name 控件唯一名称
    * @param subwin 子窗口编号
    * @param x1 左上角X坐标
    * @param y1 左上角Y坐标
    * @param x2 右下角X坐标
    * @param y2 右下角Y坐标
    * @return 创建结果（true=成功）
    */
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);

   //--- 图表事件处理器
   /**
    * @brief 处理图表事件
    * @param id 事件ID
    * @param lparam 长整数参数
    * @param dparam 双精度参数
    * @param sparam 字符串参数
    * @return 事件处理结果（true=已处理）
    */
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

   //--- 日期值操作
   /** 获取当前选中的日期（datetime类型） */
   datetime          Value(void);
   /** 设置当前选中的日期（datetime类型） */
   void              Value(datetime value);
   /** 设置当前选中的日期（MqlDateTime结构） */
   void              Value(MqlDateTime& value);

   //--- 状态控制
   /** 显示控件 */
   virtual bool      Show(void);

protected:
   //--- 内部事件处理
   /** 点击事件处理器（处理画布上的点击） */
   virtual bool      OnClick(void);

   //--- 子控件创建
   /** 创建增减按钮控件 */
   virtual bool      CreateButtons(void);
   /** 创建列表图片与画布控件 */
   virtual bool      CreateList(void);

   //--- 画布绘制
   /** 绘制日期选择界面到画布 */
   void              DrawCanvas(void);
   /** 在画布上绘制点击区域与文本 */
   void              DrawClickRect(const int idx,int x,int y,string text,const uint clr,uint alignment=0);

   //--- 子控件事件处理
   /** 减少按钮点击事件处理器 */
   virtual bool      OnClickDec(void);
   /** 增加按钮点击事件处理器 */
   virtual bool      OnClickInc(void);
   /** 列表图片点击事件处理器 */
   virtual bool      OnClickList(void);
  };
//+------------------------------------------------------------------+
//| 事件映射：关联子控件事件到处理函数                                 |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CDateDropList)
   ON_EVENT(ON_CLICK, m_dec,  OnClickDec)   // 减少按钮点击 → 调用OnClickDec
   ON_EVENT(ON_CLICK, m_inc,  OnClickInc)   // 增加按钮点击 → 调用OnClickInc
   ON_EVENT(ON_CLICK, m_list, OnClickList)  // 列表图片点击 → 调用OnClickList
EVENT_MAP_END(CWndContainer)
//+------------------------------------------------------------------+
